GtkBuilder: Introduce some private helpers
authorMatthias Clasen <mclasen@redhat.com>
Sun, 26 Apr 2015 07:07:56 +0000 (03:07 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 27 Apr 2015 05:15:21 +0000 (01:15 -0400)
Add functions that help reporting errors from builder
subparsers consistently.

gtk/gtkbuilder.c
gtk/gtkbuilderprivate.h

index 069106b3f537be3ca913eb744016b8b9c0c110c4..96b33478caf0b0ede28f8505b04b39fc0d0def2f 100644 (file)
@@ -2606,3 +2606,63 @@ gtk_builder_get_application (GtkBuilder *builder)
 
   return builder->priv->application;
 }
+
+void
+_gtk_builder_prefix_error (GtkBuilder          *builder,
+                           GMarkupParseContext *context,
+                           GError              **error)
+{
+  gint line, col;
+
+  g_markup_parse_context_get_position (context, &line, &col);
+  g_prefix_error (error, "%s:%d:%d ", builder->priv->filename, line, col);
+}
+
+void
+_gtk_builder_error_unhandled_tag (GtkBuilder           *builder,
+                                  GMarkupParseContext  *context,
+                                  const gchar          *object,
+                                  const gchar          *element_name,
+                                  GError              **error)
+{
+  gint line, col;
+
+  g_markup_parse_context_get_position (context, &line, &col);
+  g_set_error (error,
+               GTK_BUILDER_ERROR,
+               GTK_BUILDER_ERROR_UNHANDLED_TAG,
+               "%s:%d:%d Unsupported tag for %s: <%s>",
+               builder->priv->filename, line, col,
+               object, element_name);
+}
+
+gboolean
+_gtk_builder_check_parent (GtkBuilder           *builder,
+                           GMarkupParseContext  *context,
+                           const gchar          *parent_name,
+                           GError              **error)
+{
+  const GSList *stack;
+  gint line, col;
+  const gchar *parent;
+  const gchar *element;
+
+  stack = g_markup_parse_context_get_element_stack (context);
+
+  element = (const gchar *)stack->data;
+  parent = stack->next ? (const gchar *)stack->next->data : "";
+
+  if (g_str_equal (parent_name, parent) ||
+      (g_str_equal (parent_name, "object") && g_str_equal (parent, "template")))
+    return TRUE;
+
+  g_markup_parse_context_get_position (context, &line, &col);
+  g_set_error (error,
+               GTK_BUILDER_ERROR,
+               GTK_BUILDER_ERROR_INVALID_TAG,
+               "%s:%d:%d Can't use <%s> here",
+               builder->priv->filename, line, col, element);
+
+  return FALSE;
+}
+
index fe619d49740c20a75a7d6010c90513c6fa7dd6d0..d64fa10cb76cef36a2b7cc59a3be71ee4423094e 100644 (file)
@@ -185,4 +185,17 @@ guint     _gtk_builder_extend_with_template (GtkBuilder    *builder,
                                             gsize          length,
                                             GError       **error);
 
+void _gtk_builder_prefix_error            (GtkBuilder           *builder,
+                                           GMarkupParseContext  *context,
+                                           GError              **error);
+void _gtk_builder_error_unhandled_tag     (GtkBuilder           *builder,
+                                           GMarkupParseContext  *context,
+                                           const gchar          *object,
+                                           const gchar          *element_name,
+                                           GError              **error);
+gboolean _gtk_builder_check_parent        (GtkBuilder           *builder,
+                                           GMarkupParseContext  *context,
+                                           const gchar          *parent_name,
+                                           GError              **error);
+
 #endif /* __GTK_BUILDER_PRIVATE_H__ */